<html>

<head>
  <title>AccessFu test for enabling</title>

  <link rel="stylesheet" type="text/css"
        href="chrome://mochikit/content/tests/SimpleTest/test.css" />
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript"
          src="../common.js"></script>
  <script type="application/javascript"
          src="./jsatcommon.js"></script>
  <script type="application/javascript">

    function prefStart() {
      // Start AccessFu via pref.
      SpecialPowers.pushPrefEnv({"set": [['accessibility.accessfu.activate', 1]]});
      AccessFuTest.once_log("EventManager.start", AccessFuTest.nextTest);
    }

    function nextMode(aCurrentMode, aNextMode) {
      return function() {
        is(AccessFu.Input.quickNavMode.current, aCurrentMode,
          'initial current mode is correct');
        AccessFu.Input.quickNavMode.next();
        _expectMode(aNextMode, AccessFuTest.nextTest);
      }
    }

    function prevMode(aCurrentMode, aNextMode) {
      return function() {
        is(AccessFu.Input.quickNavMode.current, aCurrentMode,
          'initial current mode is correct');
        AccessFu.Input.quickNavMode.previous();
        _expectMode(aNextMode, AccessFuTest.nextTest);
      }
    }

    function setMode(aModeIndex, aExpectedMode) {
      return function() {
        SpecialPowers.pushPrefEnv(
          {"set": [['accessibility.accessfu.quicknav_index', aModeIndex]]},
          function() {
            _expectMode(aExpectedMode, AccessFuTest.nextTest);
        });
      }
    }

    function reconfigureModes() {
      SpecialPowers.pushPrefEnv(
        {"set": [['accessibility.accessfu.quicknav_modes', 'Landmark,Button,Entry,Graphic']]},
        function() {
          // When the modes are reconfigured, the current mode should
          // be set to the first in the new list.
          _expectMode('Landmark', AccessFuTest.nextTest);
      });
    }

    function _expectMode(aExpectedMode, aCallback) {
      if (AccessFu.Input.quickNavMode.current === aExpectedMode) {
        ok(true, 'correct mode');
        aCallback();
      } else {
        AccessFuTest.once_log('Quicknav mode: ' + aExpectedMode, function() {
          ok(true, 'correct mode');
          aCallback();
        });
      }
    }

    // Listen for initial 'EventManager.start' and disable AccessFu.
    function prefStop() {
      ok(AccessFu._enabled, "AccessFu was started via preference.");
      AccessFuTest.once_log("EventManager.stop", () => AccessFuTest.finish());
      SpecialPowers.pushPrefEnv({"set": [['accessibility.accessfu.activate', 0]]});
    }

    function doTest() {
      AccessFuTest.addFunc(prefStart);
      AccessFuTest.addFunc(nextMode('Link', 'Heading'));
      AccessFuTest.addFunc(nextMode('Heading', 'FormElement'));
      AccessFuTest.addFunc(nextMode('FormElement', 'Link'));
      AccessFuTest.addFunc(nextMode('Link', 'Heading'));
      AccessFuTest.addFunc(prevMode('Heading', 'Link'));
      AccessFuTest.addFunc(prevMode('Link', 'FormElement'));
      AccessFuTest.addFunc(setMode(1, 'Heading'));
      AccessFuTest.addFunc(reconfigureModes);
      AccessFuTest.addFunc(prefStop);
      AccessFuTest.waitForExplicitFinish();
      AccessFuTest.runTests([   // Will call SimpleTest.finish();
        ['accessibility.accessfu.quicknav_modes', 'Link,Heading,FormElement']]);
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  </script>

</head>
<body>
  <a target="_blank"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=811307"
     title="[AccessFu] Add mochitest for enabling">
    Mozilla Bug 811307
  </a>
</body>
</html>